package com.atguigu.mybatis.demo;

import com.atguigu.mybatis.bean.Employee;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by Smexy on 2022/12/30
 *
 *      对比JDBC: Connection(客户端和数据库服务器的一次连接)
 *      Mybatis: SqlSession(客户端和数据库服务器的一次连接)
 *
 *   ------------------------------
 *      如何创建对象:
 *          直接的方式: A a = new A()
 *
 *      如果构造器被私有或非公开，无法调用。
 *
 *          建造者模式:  A a =  new A.Builder().build()
 *          工厂模式:   A a =  new AFactory().getInstance()
 *
 *   -----------------------------
 *      参数无法封装的问题:
 *
 *      id  last_name  gender  email
 * ------  ---------  ------  -------------
 *      1  Tom        male    Tom@163.com
 *
 *     Employee e =  new Employee()
 *     e.setXxx(yyy)
 *      Xxx: 是查询的列名
 *      yyy: 是查询的列值
 *
 *      e.setId(1)
 *      e.setLast_name('Tom')
 *
 *      希望自动把 last_name 修改为 lastName,通过添加配置的方式。
 *
 *
 */
public class Demo1_HelloWorld
{
    public static void main(String[] args) throws IOException {

        //创建 SqlSessionFactory
        //指定全局配置文件的名字
        String resource = "config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //从SqlSessionFactory 获取 一个 SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        /*
            发送自己编写的sql

            selectOne(String statement, Object parameter);
                statement: 要使用 namespace.id的方式指定
                parameter： 传入的占位符参数

             ----------------
             目前存在的问题:
                    ①调用的是Mybatis提供的方法，selectOne要求传入的参数只需要是Object parameter。
                            对入参是没有类型检查

                    ②返回值类型也是T类型，需要强转或必须要传入泛型

                如何解决： 不用Mybatis提供的方法，而是自己去编写，明确方法的入参和返回值类型。
                            也称为接口式编程。
         */
        Object o = sqlSession.selectOne("feichangbang.sql1", 1);

        Employee employee = (Employee) o;

        System.out.println(employee);

        //关闭连接
        sqlSession.close();

    }
}
